<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>

<body>
    <script>
        //     函数
        // 定义
        //   函数声明
        // function theFirstName(){}
        //   函数表达式
        // var test = function(){}
        // 组成形式
        //   函数名称
        //   参数
        //     形参
        //     实参
        // function test(a, b) { //形参a,b相当于在函数里面声明了两个变量
        //     var c = a + b;
        //     arguments -- [1,2]  实参列表
        //     arguments和形参相映射(形参实参相对应的话映射)
        // }
        // test(1, 2); //实参

        // function sum(a, b, c, d) {
        //     if (sum.length > arguments.length) {
        //         console.log('形参多了');
        //     } else if (sum.length < arguments.length) {
        //         console.log('实参多了');
        //     } else {
        //         console.log('相等');
        //     }
        // }
        // sum(5, 9, 2, 7, 3);

        // 求和
        // function sum() {
        //     var result = 0;
        //     for (var i = 0; i < arguments.length; i++) {
        //         result += arguments[i];
        //     }
        //     console.log(result);
        // }
        // sum(1, 2, 3, 4, 5, 6);
        //   返回值
        // function kun() {
        //     console.log('a');
        //     return 123; //有终止函数的意思
        //     console.log('b');
        // }
        // var num = kun();
        // console.log(num);

        // var str = '123';
        // str.charAt(0); //把字符串第0位拿出来
        // str.charAt(1);

        // 练习
        // 1.写一个函数,功能是告知你所选定的小动物的叫声
        // function scream(animal) {
        //     switch (animal) {
        //         case 'dog':
        //             console.log('wang');
        //             return;
        //         case 'cat':
        //             console.log('miao');
        //             return;
        //         case 'fish':
        //             console.log('o~o~');
        //             return;
        //     }
        // }
        // scream('fish');

        // 2.写一个函数,实现加法计数器
        // function sum() {
        //     var result = 0;
        //     for (var i = 0; i < arguments.length; i++) {
        //         result += arguments[i];
        //     }
        //     console.log(result);
        // }
        // sum(1, 2, 3, 4, 5, 6);

        // 3.定义一组函数,输入数字,逆转并输出汉字形式
        // function reverse() {
        //     var num = window.prompt('input');
        //     var str = '';
        //     for (var i = num.length - 1; i >= 0; i--) {
        //         str += transfer(num[i]);
        //     }
        //     console.log(str);
        // }

        // function transfer(target) {
        //     switch (target) {
        //         case '1':
        //             return '壹';
        //         case '2':
        //             return '贰';
        //         case '3':
        //             return '叁';
        //         case '4':
        //             return '肆';
        //         case '5':
        //             return '伍';
        //         case '6':
        //             return '陆';
        //         case '7':
        //             return '柒';
        //         case '8':
        //             return '捌';
        //         case '9':
        //             return '玖';
        //         case '0':
        //             return '零';
        //     }
        // }
        // reverse();







        // 要求输入一串低于10位的数字,输出这串数字的中文大小写
        // eg:  input:10000   output:壹万
        // eg:  input:1001010   output:壹佰万壹仟零壹拾
        // var strNumber = ['零', '壹', '贰', '叁', '肆', '伍', '陆', '柒', '捌', '玖', '拾'];
        // var numberOfWeight = ['', '拾', '佰', '仟', '万', '拾', '佰', '仟', '亿', ''];

        // var num = window.prompt();
        // chineseNumber(num);

        // function chineseNumber(num) {
        //     var onum = num;
        //     if (onum == 0) {
        //         print(strNumber[num[0]]);
        //         return;
        //     }
        //     while (num != '') {
        //         if (num > 0) {
        //             if (num[0] == 0) {
        //                 if (num.length <= 4)
        //                     print(strNumber[num[0]]);
        //             } else {
        //                 print(strNumber[num[0]]);
        //             }

        //             if (num[0] > 0 || num.length > 4)
        //                 print(numberOfWeight[num.length - 1]);
        //         }
        //         num = num.substring(1);
        //         while (num[0] == 0 && num[1] == 0) {
        //             num = num.substring(1);
        //         }
        //     }
        // }

        // function print(s) {
        //     console.log(s);
        // }



        //       作用域精解
        // [[scope]]:每个javascript函数都是一个对象，对象中有些属性
        // 我们可以访问，但有些不可以，这些属性仅供javascript引擎存取
        // [[scope]]就是其中一个。
        // [[scope]]指的就是我们所说的作用域，其中储存了运行期上下文的集合

        // 作用域链：[[scope]]中所储存的执行期上下文对象的集合
        // 这个集合呈链式连接，我们把这种链式连接叫做作用域链

        // 运行期上下文：当函数执行时，会创建一个称为执行期上下文的内部对象。
        // 一个执行期上下文定义了一个函数执行时的环境，函数每次执行时对应的
        // 执行期上下文都是独一无二的，所以多次调用一个函数会导致创建多个
        // 执行上下文，当函数执行完毕，它所产生的执行上下被销毁。

        // 查找变量：从作用域链依次向下查找。

        // function a() {
        //     function b() {
        //         function c() {}
        //         c();
        //     }
        //     b();
        // }
        // a();
        // a  定义  a.[[scope]] -- >  0: Go 
        // a  执行  a.[[scope]] -- >  0: aAo
        //                            1: Go

        // b  定义  a.[[scope]] -- >  0:  aAo
        //                            1:  Go
        // b  执行  a.[[scope]] -- >  0:  bAo
        //                            1:  aAo
        //                            2:  Go

        // c  定义  a.[[scope]] -- >  0:  bAo
        //                            1:  aAo
        //                            2:  Go
        // c  执行  a.[[scope]] -- >  0:  cAo
        //                            1:  bAo
        //                            2:  aAo
        //                            3:  Go
    </script>
</body>

</html>